/**
 * Created by wentan on 2018/12/11.
 */

const router = require('express').Router();
const joi = require('joi');
const joiValidate = require('../../utils/joiValidate');
const loginService = require('../../service/user/loginService');
const userService = require('../../service/user/userService');
const LockUtil = require('../../utils/lockUtil');
const ErrorCode = require('../../utils/errorCode');
const course = require('./course');
const account = require('./account');
const apply = require('./apply');
const verifyUser = require('../../utils/jwtHanlder');
const BaseResp = require('../../utils/baseResp');
const errorCode = require('../../utils/errorCode');

/**
 * @apiDefine User  权限相关接口
 */

/**
 * @api {post} /v1/user/login  微信登陆
 * @apiVersion 1.0.0
 * @apiName UserLogin
 * @apiGroup  User
 *
 * @apiDescription 教练登陆
 *
 * @apiParam {String} code  微信登陆的code码
 *
 * @apiExample Example usage:
 * curl -i http://localhost:3502/v1/user/login
 *
 * @apiSuccess {Number} code      请求结果编码，0：正常， 其他为异常
 * @apiSuccess {string} message    请求结果编码对应的message
 * @apiSuccess {Object[]} data    返回值数据
 * @apiSuccess {Object} data.userInfo  用户信息，一个对象
 * @apiSuccess {String}   data.userInfo.userId    用户ID
 * @apiSuccess {Number}   data.userInfo.identity   (0代表普通用户，1代表教练)
 * @apiSuccess {String}   data.token   token
 *
 * @apiSuccessExample 正常响应：
 *     HTTP/1.1 200
 *     {
          "code": 200,
          "message": "请求成功",
          "data": {
               "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkYXRhIjp7InVzZXJJZCI6MSwidG9rZW4iOjF9LCJleHAiOjE1MjA0MjA2MzQsImlhdCI6MTUyMDQyMDYwNH0.jC5ktF2WLO6rjbSQoH-2ZYY5YJ0JVXVFEhgUrA_kISk"
               "userInfo": {
                    "userId": 1,
                    "identity": 0
               }
          }
       }
 *
 *
 * @apiError  ServerError  服务器异常
 *
 * @apiErrorExample Response (example):
 *     HTTP/1.1 500 ServerError
 *     {
 *       "code": 500,
 *       "message": "服务器异常"
 *     }
 */
router.post('/login', joiValidate(joi.object().keys({
  code: joi.string().required().label('请输入微信code码')
})), async (req, res, next) => {
  const {
    code
  } = req.body;
  loginService.login({ code })
    .then(data => res.success(data))
    .catch(e => next(e));
});

/**
 * @api {post} /v1/user/commit  用户申请提交
 * @apiVersion 1.0.0
 * @apiName UserCommit
 * @apiGroup  User
 *
 * @apiDescription 教练申请提交 （需登录，将token带上）
 *
 * @apiParam {String} name  名称
 * @apiParam {String} realName  真实名称
 * @apiParam {String} phone  手机号码
 * @apiParam {String} description  介绍描述
 * @apiParam {Array} images  图片介绍
 * @apiParam {String} images.path  图片路径
 * @apiParam {Number=0,1} images.type  图片类别(0代表自拍照，1代表各种其他照片)
 *
 * @apiExample Example usage:
 * curl -i http://localhost:3502/v1/user/commit
 *
 * @apiSuccess {Number} code      请求结果编码，0：正常， 其他为异常
 * @apiSuccess {string} message    请求结果编码对应的message
 *
 * @apiSuccessExample 正常响应：
 *     HTTP/1.1 200
 *     {
          "code": 200,
          "message": "请求成功"
       }
 *
 *
 * @apiError  ServerError  服务器异常
 *
 * @apiErrorExample Response (example):
 *     HTTP/1.1 500 ServerError
 *     {
 *       "code": 500,
 *       "message": "服务器异常"
 *     }
 */
router.post('/commit', verifyUser.verify(), joiValidate(joi.object().keys({
  name: joi.string().required().label('请输入你的名称'),
  realName: joi.string().required().label('真实名称'),
  phone: joi.string().required().label('请输入你的电话号码'),
  description: joi.string().required().min(10).label('请输入你的描述,不得低于10个字'),
  images: joi.array().items(joi.object({
    path: joi.string().required().label('请传入图片路径'),
    type: joi.number().valid([0, 1]).required().label('请传入图片类型')
  })).min(1).required().label('图片上传格式有误')
})), async (req, res, next) => {
  const {
    name,
    phone,
    description,
    images,
    realName
  } = req.body;
  const { userId } = req.user;
  // 创建申请创建锁，避免重复提交
  const lockUtil = new LockUtil('apply:create:', userId, 120);
  return lockUtil.tryLock()
    .then(() => userService.applyCommit({ name, phone, description, userId, images, realName }))
    .then((data) => {
      // 删除请求锁
      lockUtil.unlock().catch(console.error);
      res.success(data);
    })
    .catch((err) => {
      // 非频繁访问时删除频繁队列key
      if (err.code !== ErrorCode.FREQUENT_REQUEST) lockUtil.unlock().catch(console.error);
      next(err);
    });
});

/**
 * @api {get} /v1/user/commit/status  获取用户教练申请的提交状态
 * @apiVersion 1.0.0
 * @apiName GetUserCommitStatus
 * @apiGroup  User
 *
 * @apiDescription 获取申请的提交状态 （需登录，将token带上）
 *
 * @apiExample Example usage:
 * curl -i http://localhost:3502/v1/user/commit/status
 *
 * @apiSuccess {Number} code      请求结果编码，0：正常， 其他为异常
 * @apiSuccess {string} message    请求结果编码对应的message
 * @apiSuccess {Object} data    返回结果集
 * @apiSuccess {Object} data.info    返回结果集
 * @apiSuccess {Number} data.info.status    (0代表没有发起申请，可申请，1代表正在审核中，10代表审核通过, -10代表审核不通过)
 * @apiSuccess {String} data.info.refuseMark    拒绝理由
 *
 * @apiSuccessExample 正常响应：
 *     HTTP/1.1 200
       {
          "code": 200,
          "message": "请求成功",
          "data": {
              "info": {
                  "status": 1
              }
          }
      }
 *
 *
 * @apiError  ServerError  服务器异常
 *
 * @apiErrorExample Response (example):
 *     HTTP/1.1 500 ServerError
 *     {
 *       "code": 500,
 *       "message": "服务器异常"
 *     }
 */
router.get('/commit/status', verifyUser.verify(), (req, res, next) => {
  const { userId } = req.user;
  userService.getCommitStatus({ userId })
    .then((data) => res.success({ info: data }))
    .catch(e => next(e))
});

/**
 * @api {get} /v1/user/jinfo  获取教练的基础信息
 * @apiVersion 1.0.0
 * @apiName GetUserJInfo
 * @apiGroup  User
 *
 * @apiDescription 获取教练的基础信息 （需登录，将token带上）
 *
 * @apiExample Example usage:
 * curl -i http://localhost:3502/v1/user/jinfo
 *
 * @apiSuccess {Number} code      请求结果编码，0：正常， 其他为异常
 * @apiSuccess {string} message    请求结果编码对应的message
 * @apiSuccess {Object} data    返回结果集
 * @apiSuccess {Object} data.info    返回结果集
 * @apiSuccess {Number} data.info.status    (0代表没有发起申请，可申请，1代表正在审核中，10代表审核通过, -10代表审核不通过)
 * @apiSuccess {String} data.info.refuseMark    拒绝理由
 *
 * @apiSuccessExample 正常响应：
 *     HTTP/1.1 200
 {
    "code": 200,
    "message": "请求成功",
    "data": {
        "info": {
            "id": 10,
            "status": 10,
            "refuseMark": "",
            "name": "胡",
            "realName": "",
            "description": "可口可乐了看看啦啦啦啦图来看看",
            "images": [
                {
                    "imagePath": "https://xiaoqingjing.oss-cn-beijing.aliyuncs.com/tyk/tmp_aa3ca8069cd7bf97365cc242258193c320f36a0272a75dc5.gif",
                    "type": 0
                },
                {
                    "imagePath": "https://xiaoqingjing.oss-cn-beijing.aliyuncs.com/tyk/tmp_ccbcfc3656cfe76489b3b630b45232ec9cc6aac3fb7b0471.jpg",
                    "type": 1
                }
            ]
        }
    }
}
 *
 *
 * @apiError  ServerError  服务器异常
 *
 * @apiErrorExample Response (example):
 *     HTTP/1.1 500 ServerError
 *     {
 *       "code": 500,
 *       "message": "服务器异常"
 *     }
 */
router.get('/jinfo', verifyUser.verify(), (req, res, next) => {
    const { userId } = req.user;
    userService.getJiaoUserDetail({ userId })
        .then((data) => res.success({ info: data }))
        .catch(e => next(e))
})

/**
 * @api {get} /v1/user/info 获取用户的基本信息
 * @apiVersion 1.0.0
 * @apiName GetUserBaseInfo
 * @apiGroup  User
 *
 * @apiDescription 获取用户的基础信息 （需登录，将token带上）
 *
 * @apiExample Example usage:
 * curl -i http://localhost:3502/v1/user/info
 *
 * @apiSuccess {Number} code      请求结果编码，0：正常， 其他为异常
 * @apiSuccess {string} message    请求结果编码对应的message
 * @apiSuccess {Object} data    返回结果
 * @apiSuccess {Object} data.info    返回结果集
 * @apiSuccess {Number} data.info.id    用户Id
 * @apiSuccess {String} data.info.name    用户昵称
 * @apiSuccess {String} data.info.phone    电话号码
 * @apiSuccess {String} data.info.avatar    用户头像
 * @apiSuccess {Number} data.info.identity    用户身份标识（0代表普通用户，1代表教练）
 * @apiSuccess {String} data.info.description    用户的自我描述
 * @apiSuccess {Object[]} data.info.images    图片数组
 *
 * @apiSuccessExample 正常响应：
 *     HTTP/1.1 200
       {
          "code": 200,
          "message": "请求成功",
          "data": {
              "info": {
                  "id": 7,
                  "name": "",
                  "avatar": "",
                  "identity": 0,
                  "phone": 0,
                  "description": ""
              }
          }
      }
 *
 *
 * @apiError  ServerError  服务器异常
 *
 * @apiErrorExample Response (example):
 *     HTTP/1.1 500 ServerError
 *     {
 *       "code": 500,
 *       "message": "服务器异常"
 *     }
 */
router.get('/info', verifyUser.verifyHasToken(),  joiValidate(joi.object().keys({
  uid: joi.number().label('查询其他用户的信息')
})),(req, res, next) => {
  let { userId } = req.user;
  const { uid } = req.query;
  if (uid) {
    userId = uid
  }
  if (!userId) {
    return next(BaseResp.error(errorCode.paramsError, '请传入要查看的用户'))
  }
  userService.getUserInfo({ userId, uid })
    .then(data => res.success({ info: data }))
    .catch(e => next(e))
});

/**
 * @api {post} /v1/user/modify 修改用户的基本信息
 * @apiVersion 1.0.0
 * @apiName ModifyUserInfo
 * @apiGroup  User
 *
 * @apiDescription 修改用户的基本信息 （需登录，将token带上）
 *
 * @apiParam {String} name  修改的名称
 * @apiParam {String} avatar  修改的头像
 * @apiParam {String} [phone]  电话号码
 *
 * @apiExample Example usage:
 * curl -i http://localhost:3502/v1/user/modify
 *
 * @apiSuccess {Number} code      请求结果编码，0：正常， 其他为异常
 * @apiSuccess {string} message    请求结果编码对应的message
 *
 * @apiSuccessExample 正常响应：
 *     HTTP/1.1 200
 {
          "code": 200,
          "message": "请求成功"
}
 *
 *
 * @apiError  ServerError  服务器异常
 *
 * @apiErrorExample Response (example):
 *     HTTP/1.1 500 ServerError
 *     {
 *       "code": 500,
 *       "message": "服务器异常"
 *     }
 */
router.post('/modify', verifyUser.verify(), joiValidate(joi.object().keys({
  name: joi.string().max(32).label('请输入要修改的名称,不能过长'),
  avatar: joi.string().label('请输入要修改的头像'),
  phone: joi.string().allow(null, '').label('请输入电话'),
})), (req, res, next) => {
  const { userId } = req.user;
  const { name, avatar, phone } = req.body;
  // 创建申请创建锁，避免重复提交
  const lockUtil = new LockUtil('user:modify:', userId, 120);
  return lockUtil.tryLock()
    .then(() =>  userService.modifyUserInfo({ userId, name, avatar, phone }))
    .then((data) => {
      // 删除请求锁
      lockUtil.unlock().catch(console.error);
      res.success(data);
    })
    .catch((err) => {
      // 非频繁访问时删除频繁队列key
      if (err.code !== ErrorCode.FREQUENT_REQUEST) lockUtil.unlock().catch(console.error);
      next(err);
    });
});

router.use('/course', course);

router.use('/account', account);

router.use('/apply', apply);

module.exports = router;
